// @Description 测试服务层
// @Author  xiaoyang
// @Date  2025/11/26

package services

import (
	"golang-manage-admin/http/modules/demo/dto"
	"golang-manage-admin/lib"
	"golang-manage-admin/providers"
	"golang-manage-admin/queue/publish"
	"math/rand"
	"strconv"
	"time"
)

// TestService 测试服务
type TestService struct {
	Service
}

// TestData 测试数据结构
type TestData struct {
	Code string      `json:"code"`
	Msg  string      `json:"msg"`
	Data interface{} `json:"data"`
}

// TestMessage 测试消息
// 用于测试HTTP连接和日志写入功能
func (s *TestService) TestMessage() error {
	providers.Logger.Info("测试写入日志。。。")
	return nil
}

// BatchSendDelayedTasks 批量发送延时任务
// 批量投递10000个延时任务到队列中，用于测试延时消息功能
func (s *TestService) BatchSendDelayedTasks() error {
	// 投递 10000 个延时任务
	for x := 0; x < 10000; x++ {
		// 使用当前时间作为随机数种子
		rand.Seed(time.Now().UnixNano())
		// 生成一个 0~86400 的随机数（一天的秒数）
		count := rand.Intn(60 * 60 * 24)

		form := &dto.SendDelayedTaskForm{
			TaskId:     lib.GenerateID(),
			TaskName:   "test-delayed-task-" + strconv.Itoa(count),
			FromSystem: "test-system-local",
			FromApi:    "test-system-api",
			Expires:    strconv.Itoa(count * 1000),
			Detail:     "详情-" + strconv.Itoa(count) + "秒",
			Data:       "{\"url\":\"http://127.0.0.1:17080/api/test/test\"}",
		}

		response, err := lib.HttpPostValues("http://127.0.0.1:17080/api/test/send-delayed-task", lib.StructToMap(form))
		if err != nil {
			_ = providers.Logger.Errorf("系统信息同步失败：%+v，原因：%s", response, err.Error())
		}
	}
	return nil
}

// SendMessageToQueue 发送消息到队列
// 推送测试消息到队列中，用于测试消息队列功能
func (s *TestService) SendMessageToQueue() error {
	data := &TestData{
		Code: "200",
		Msg:  "测试",
	}

	pushErr := publish.PublishObject.PushFormat(publish.CTest, data)
	if pushErr != nil {
		_ = providers.Logger.Errorf("推送消息接收队列失败Error:%s, Content:%+v", pushErr.Error(), data)
		return pushErr
	}

	providers.Logger.Debugf("推送消息体推送队列成功: %+v", data)
	return nil
}

// SendMessageExpiration 发送过期消息
// 推送消息到死信队列中，测试Per-queue-Message-TTL功能
func (s *TestService) SendMessageExpiration() error {
	data := &TestData{
		Code: "200",
		Msg:  "测试",
	}

	pushErr := publish.PublishObject.PushFormat(publish.CDeadLetter, data)
	if pushErr != nil {
		_ = providers.Logger.Errorf("推送消息接收队列失败Error:%s, Content:%+v", pushErr.Error(), data)
		return pushErr
	}

	providers.Logger.Debugf("消息接收消息体推送队列成功: %+v", data)
	return nil
}

// SendDelayedMessage 发送延时消息
// 推送延时消息到队列中，测试Per-message-TTL功能
func (s *TestService) SendDelayedMessage(context, expires string) error {
	form := struct {
		Context string `json:"context"`
		Expires string `json:"expires"`
	}{
		Context: context,
		Expires: expires,
	}

	providers.Logger.Debugf("接收消息体成功: %+v", form)

	pushErr := publish.PublishObject.PushFormatDelayed(publish.CDelayed, form, "100000")
	if pushErr != nil {
		_ = providers.Logger.Errorf("推送消息接收队列失败Error:%s, Content:%+v", pushErr.Error(), form)
		return pushErr
	}

	providers.Logger.Debugf("消息接收消息体推送队列成功: %+v", form)
	return nil
}
